import * as XLSX from 'xlsx';
/**
 * 导入excel
 */
export function importExcel(file, headers, success, error) {
    // 获取上传的文件对象
    const { files } = file.target;
    // 通过FileReader对象读取文件
    const fileReader = new FileReader();
    fileReader.onload = event => {
        try {
            const { result } = event.target;
            // 以二进制流方式读取得到整份excel表格对象
            const workbook = XLSX.read(result, { type: 'binary' });
            let data = []; // 存储获取到的数据
            // 遍历每张工作表进行读取（这里默认只读取第一张表）
            for (const sheet in workbook.Sheets) {
                if (workbook.Sheets.hasOwnProperty(sheet)) {
                    // 利用 sheet_to_json 方法将 excel 转成 json 数据
                    data = data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
                    // break; // 如果只取第一张表，就取消注释这行
                }
            }
            // 替换属性名
            if (data && data.length > 0) {
                const newData = [];
                data.forEach(item => {
                    const newObj = {};
                    headers.forEach(obj => {
                        newObj[obj.dataIndex] = item[obj.title];
                    });
                    newData.push(newObj);
                });
                data = newData;
            }
            // 成功读取处理
            success(data);
        } catch (e) {
            // 这里可以抛出文件类型错误不正确的相关提示
            error(e);
            return;
        }
    };
    // 以二进制方式打开文件
    fileReader.readAsBinaryString(files[0]);
}

/**
 * 导入excel多张表
 */
export function importExcels(file, headers, success, error) {
    // 获取上传的文件对象
    const { files } = file.target;
    // 通过FileReader对象读取文件
    const fileReader = new FileReader();
    fileReader.onload = event => {
        try {
            const { result } = event.target;
            // 以二进制流方式读取得到整份excel表格对象
            const workbook = XLSX.read(result, { type: 'binary' });
            const data = {}; // 存储获取到的数据
            for (const sheet in workbook.Sheets) {
                if (workbook.Sheets.hasOwnProperty(sheet)) {
                    // 利用 sheet_to_json 方法将 excel 转成 json 数据
                    data[sheet] = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]);
                }
            }
            const datas = [];

            let count = 0;
            for (const key in data) {
                datas[count] = data[key];
                count++;
            }
            headers.forEach((item, index) => {
                // for (let i = 0; i < datas.length; i++) {
                const ele = datas[index];
                const newData = [];
                if (ele && ele.length > 0) {
                    ele.forEach(item => {
                        const newObj = {};
                        headers[index].forEach(obj => {
                            newObj[obj.dataIndex] = item[obj.title];
                        });
                        newData.push(newObj);
                    });
                    datas[index] = newData;
                    // break;
                }
            });
            // 成功读取处理
            success(datas);
        } catch (e) {
            // 这里可以抛出文件类型错误不正确的相关提示
            error(e);
            return;
        }
    };
    // 以二进制方式打开文件
    fileReader.readAsBinaryString(files[0]);
}

/**
 * 导出excel
 */
export function exportExcel(headers, data, fileName) {
    const _headers = headers
        .map((item, i) =>
            Object.assign(
                {},
                {
                    dataIndex: item.dataIndex,
                    title: item.title,
                    position:
                        i >= 26
                            ? String(String.fromCharCode(65 + (i - 26)) + String.fromCharCode(65 + (i - 26))) + 1
                            : String.fromCharCode(65 + i) + 1,
                }
            )
        )
        .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { dataIndex: next.dataIndex, v: next.title } }), {});
    console.log(_headers, '_headers');

    const _data = data
        .map((item, i) =>
            headers.map((key, j) =>
                Object.assign(
                    {},
                    {
                        content: item[key.dataIndex],
                        position:
                            j >= 26
                                ? String(String.fromCharCode(65 + (j - 26)) + String.fromCharCode(65 + (j - 26))) + (i + 2)
                                : String.fromCharCode(65 + j) + (i + 2),
                    }
                )
            )
        )
        // 对刚才的结果进行降维处理（二维数组变成一维数组）
        .reduce((prev, next) => prev.concat(next))
        // 转换成 worksheet 需要的结构
        .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { v: next.content } }), {});

    // 合并 headers 和 data
    const output = Object.assign({}, _headers, _data);
    // 获取所有单元格的位置
    const outputPos = Object.keys(output);
    // 计算出范围 ,["A1",..., "H2"]
    const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;

    // 构建 workbook 对象
    const wb = {
        SheetNames: ['mySheet'],
        Sheets: {
            mySheet: Object.assign({}, output, {
                '!ref': ref,
                '!cols': headers.map(item => ({ wpx: 100 })),
            }),
        },
    };
    // 导出 Excel
    XLSX.writeFile(wb, fileName);
}

/**
 * 导出excel含有多张表
 */
export function exportExcels(headers, data, fileName, sheetNames?: string[]) {
    const num: any = headers.length;
    const exportObjs: any = [];
    for (let index = 0; index < num; index++) {
        let _headers: any = [];
        let _data: any = [];
        if (headers[index] && headers[index].length) {
            _headers = headers[index]
                .map((item, i) =>
                    Object.assign(
                        {},
                        {
                            dataIndex: item.dataIndex,
                            title: item.title,
                            position:
                                i >= 26
                                    ? String(String.fromCharCode(65 + i / 26 - 1) + String.fromCharCode(65 + (i - 26))) + 1
                                    : String.fromCharCode(65 + i) + 1,
                        }
                    )
                )
                .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { dataIndex: next.dataIndex, v: next.title } }), {});
        }

        if (data[index] && data[index].length) {
            _data = data[index]
                .map((item, i) =>
                    headers[index].map((key, j) =>
                        Object.assign(
                            {},
                            {
                                content: item[key.dataIndex],
                                position:
                                    j >= 26
                                        ? String(String.fromCharCode(65 + j / 26 - 1) + String.fromCharCode(65 + (j - 26))) + (i + 2)
                                        : String.fromCharCode(65 + j) + (i + 2),
                            }
                        )
                    )
                )
                // 对刚才的结果进行降维处理（二维数组变成一维数组）
                .reduce((prev, next) => prev.concat(next))
                // 转换成 worksheet 需要的结构
                .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { v: next.content } }), {});
        }
        // 合并 headers 和 data
        const output = Object.assign({}, _headers, _data);
        // 获取所有单元格的位置
        const outputPos = Object.keys(output);
        // 计算出范围 ,["A1",..., "H2"]
        const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;
        const exportObj: any = {};
        exportObj.output = Object.assign({}, _headers, _data);
        exportObj.outputPos = Object.keys(output);
        exportObj.ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;
        exportObjs.push(exportObj);
    }
    // const sheets = {};
    // for (let index = 0; index < num; index++) {
    //     const ele = exportObjs[index];
    //     sheets[sheetNames[index]] = Object.assign({}, exportObjs[index].output, {
    //         '!ref': exportObjs[index].ref,
    //         '!cols': headers.map(item => ({ wpx: 100 })),
    //     });
    // }

    // 构建 workbook 对象
    const wb = {
        // sheetNames: sheetNames,
        // Sheets: sheets,
        SheetNames: ['风险试算列表', '质押券', 'ETF成分股信息'],
        Sheets: {
            风险试算列表: Object.assign({}, exportObjs[0].output, {
                '!ref': exportObjs[0].ref,
                '!cols': headers.map(item => ({ wpx: 100 })),
            }),
            质押券: Object.assign({}, exportObjs[1].output, {
                '!ref': exportObjs[1].ref,
                '!cols': headers.map(item => ({ wpx: 100 })),
            }),
            ETF成分股信息: Object.assign({}, exportObjs[2].output, {
                '!ref': exportObjs[2].ref,
                '!cols': headers.map(item => ({ wpx: 100 })),
            }),
        },
    };

    // 导出 Excel
    XLSX.writeFile(wb, fileName);
}
export default { importExcel, exportExcel };
